

// 随机数生成的测试
#include <iostream>
#include <string>
#include <sstream>
#include <random>
#include <iomanip>
#include <atomic>

std::string uuid()
{
    std::random_device rd;           // 生成机器随机数,作为伪随机数的种子
    std::mt19937_64 generator(rd()); // 通过梅塞旋转算法，生成一个伪随机数
    // std::cout<<generator()<<std::endl;

    // 将生成的随机数的区间控制到0-255之间
    std::uniform_int_distribution<int> distribution(0, 255);
    // std::cout<<distribution(generator)<<std::endl;

    std::stringstream ss;
    // 生成8个随机数，转化为16进制，再拼接再一起
    for (int i = 0; i < 8; i++)
    {
        // 设置位宽和填充
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        if (i == 3 || i == 5 || i == 7)
            ss << "-";
    }
    // std::cout << ss.str() << std::endl;

    // 再给生成的字符串后面添加序号
    static std::atomic<size_t> seq(1); // 定义一个原子类型整数，初始化为1
    size_t num = seq.fetch_add(1);

    // size_t 类型在64位下位8字节
    // 取出每字节的数据，转化位16进制，拼接在字符串的后面
    for (int i = 7; i >= 0; i--)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i * 8) & (0xff));
        if (i == 6)
            ss << "-";
    }
    return ss.str();
}
int main()
{
    for (int i = 0; i < 20; i++)
        std::cout << uuid() << std::endl;
    return 0;
}